package com.edu.exam.entity.quality.audit;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 审核意见实体类
 * [所属模块] E-05 巡考管理模块
 *
 * <p>审核意见实体用于记录审核过程中的意见和建议，支持多级评论、
 * 私密评论、问题解决状态跟踪等功能。提供完整的审核意见管理。</p>
 *
 * <p>核心功能：
 * - 意见记录：记录审核人员的具体意见和建议
 * - 评论管理：支持评论的创建、回复、修改等功能
 * - 问题跟踪：跟踪审核问题的解决状态
 * - 权限控制：控制评论的可见性和访问权限</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditComment {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 任务ID
     *
     * <p>所属审核任务的ID，关联audit_task表。
     * 用于标识意见所属的审核任务。</p>
     */
    @Column(name = "task_id", nullable = false)
    private Long taskId;

    /**
     * 内容
     *
     * <p>审核意见的具体内容。
     * 应该清晰、具体地描述发现的问题、建议或意见。</p>
     */
    @Column(name = "content", nullable = false, columnDefinition = "TEXT")
    private String content;

    /**
     * 评论类型
     *
     * <p>审核意见的类型标识，用于分类管理不同类型的意见。
     * 支持的类型包括：SUGGESTION（建议）、ISSUE（问题）、QUESTION（疑问）、APPROVAL（同意）、REJECTION（拒绝）等。</p>
     */
    @Column(name = "comment_type", nullable = false, length = 20)
    private String commentType;

    /**
     * 作者ID
     *
     * <p>发表审核意见的用户ID，关联系统用户表。
     * 用于记录意见的发表人。</p>
     */
    @Column(name = "author_id", nullable = false)
    private Long authorId;

    /**
     * 作者姓名
     *
     * <p>发表审核意见的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "author_name", nullable = false, length = 100)
    private String authorName;

    /**
     * 作者角色
     *
     * <p>发表意见时的用户角色，用于权限控制和显示。
     * 如：审核员、审批人、观察员等。</p>
     */
    @Column(name = "author_role", length = 50)
    private String authorRole;

    /**
     * 是否私密
     *
     * <p>标识评论是否为私密评论。
     * true表示仅特定人员可见，false表示公开可见。</p>
     */
    @Column(name = "is_private", nullable = false)
    private Boolean isPrivate = false;

    /**
     * 是否已解决
     *
     * <p>标识评论中提到的问题是否已解决。
     * 主要用于问题类型的评论跟踪。</p>
     */
    @Column(name = "is_resolved", nullable = false)
    private Boolean isResolved = false;

    /**
     * 父评论ID
     *
     * <p>父评论的ID，用于支持多级评论结构。
     * null表示顶级评论。</p>
     */
    @Column(name = "parent_comment_id")
    private Long parentCommentId;

    /**
     * 评论数据
     *
     * <p>JSON格式的评论扩展数据。
     * 包含评论的额外信息、标签、分类等。</p>
     */
    @Column(name = "comment_data", columnDefinition = "TEXT")
    private String commentData;

    /**
     * 附件数量
     *
     * <p>评论关联的附件数量。
     * 用于显示和管理评论附件。</p>
     */
    @Column(name = "attachment_count")
    private Integer attachmentCount = 0;

    /**
     * 点赞数
     *
     * <p>评论获得的点赞数量。
     * 用于评论热度统计。</p>
     */
    @Column(name = "like_count")
    private Integer likeCount = 0;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 评论类型常量
    /** 评论类型 - 建议 */
    public static final String TYPE_SUGGESTION = "SUGGESTION";

    /** 评论类型 - 问题 */
    public static final String TYPE_ISSUE = "ISSUE";

    /** 评论类型 - 疑问 */
    public static final String TYPE_QUESTION = "QUESTION";

    /** 评论类型 - 同意 */
    public static final String TYPE_APPROVAL = "APPROVAL";

    /** 评论类型 - 拒绝 */
    public static final String TYPE_REJECTION = "REJECTION";

    /** 评论类型 - 说明 */
    public static final String TYPE_EXPLANATION = "EXPLANATION";

    /** 评论类型 - 补充 */
    public static final String TYPE_SUPPLEMENT = "SUPPLEMENT";

}